package com.ruoyi.course.util;

import java.util.List;
import java.util.Random;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class ClassUtil {
    private ClassUtil() {
    }

    public static final Random RANDOM = new Random();

    /**
     * 课程表最大节数，当前是 25，用于生成随机时间的上限
     */
    public static final int MAX_CLASS_TIME = 25;
    /**
     * 用于切割获得编码的染色体中需要的属性
     *
     * @param aim 目标信息
     * @param source 源编码
     * @return 切割出来的目标信息
     */
//    public static String cutGene(String aim, String source) {
//        switch (aim) {
//            case ConstantInfo.IS_FIX:
//                // 固定时间 1
//                return source.substring(0, 1);
//            case ConstantInfo.GRADE_NO:
//                // 年级编号 2
//                return source.substring(1, 3);
//            case ConstantInfo.CLASS_NO:
//                // 班级编号 11
//                return source.substring(3, 11);
//            case ConstantInfo.TEACHER_NO:
//                // 讲师编号 5
//                return source.substring(11, 16);
//            case ConstantInfo.COURSE_NO:
//                // 课程编号 6
//                return source.substring(16, 22);
//            case ConstantInfo.COURSE_ATTR:
//                // 课程属性 2
//                return source.substring(22, 24);
//            case ConstantInfo.CLASS_TIME:
//                // 上课时间
//                return source.substring(24, 26);
//            case ConstantInfo.CLASSROOM_NO:
//                // 教室编号
//                return source.substring(26, 32);
//            default:
//                return "";
//        }
//    }
    /**
     * @author lyk
     * @description 生成随机时间
     * @date 2024/4/23 21:39
     * @return -> 两位时间
     **/
    public static String randomTime() {
        int temp = RANDOM.nextInt(MAX_CLASS_TIME) + 1;
        return temp < 10 ? ("0" + temp) : String.valueOf(temp);
    }
    /**
     * @author lyk
     * @description 生成 01 - 25 的时间集合
     * @date 2024/4/10 09:41
     * @return -> java.util.List<java.lang.String>
     **/
    private static List<String> getAllTime() {
        return IntStream.rangeClosed(1, MAX_CLASS_TIME).mapToObj(i -> i < 10 ? ("0" + i) : String.valueOf(i)).collect(Collectors.toList());
    }
    /**
     * @author lyk
     * @description 同一个班级同时有两个时间在上课的冲突问题
     * @date 2024/4/10 09:24
     * @param gene 当前发生冲突的基因编码
     * @param geneList 种群
     * @param classNo 班级
     * @param teacherNo 讲师编号
     * @param classTime 上课时间
     * @return -> java.lang.String
     **/
//    public static String randomTimeForClassConflict(String gene, List<String> geneList, String classNo, String teacherNo, String classTime) {
//
//        // 找出当前班级在 01-25 时间之间还未使用的时间
//        Set<String> usedTimeList =
//                geneList.stream().filter(item -> cutGene(ConstantInfo.CLASS_NO, item).equals(classNo))
//                        .map(item -> cutGene(ConstantInfo.CLASS_TIME, item)).sorted().collect(Collectors.toSet());
//
//        log.debug("{} 班级 剩余空闲上课时间 {}", classNo, usedTimeList);
//
//        return getFreeTime(usedTimeList);
//    }
//    public static String randomTimeForTeacherConflict(String gene, List<String> geneList, String teacherNo, String classNo) {
//
//        // 找出当前教师在 01-25 时间之间还未使用的时间
//        Set<String> usedTimeList =
//                geneList.stream().filter(item -> cutGene(ConstantInfo.TEACHER_NO, item).equals(teacherNo))
//                        .map(item -> cutGene(ConstantInfo.CLASS_TIME, item)).sorted().collect(Collectors.toCollection(LinkedHashSet::new));
//
//        log.debug("{} 讲师 已经用的上课时间 {}", teacherNo, usedTimeList);
//
//        return getFreeTime(usedTimeList);
//    }
    /**
     * @author lyk
     * @description 获取 01-25 内还未使用的时间
     * @return -> java.lang.String
     **/
    private static String getFreeTime(Set<String> usedTimeList) {
        List<String> allTime = getAllTime();

        boolean isRemoveSuccess = allTime.removeAll(usedTimeList);

        if (isRemoveSuccess && !allTime.isEmpty()) {
            int randomIndex = RANDOM.nextInt(allTime.size());
            return allTime.get(randomIndex);
        }

        return randomTime();
    }
}
